#pragma once

#include <iostream>
#include <string>
#include <pthread.h>
#include <functional>
#include <cstdio>

typedef void *(*fun_t)(void *);

// ThreadData: 存储线程的额外数据
class ThreadData
{
public:
    void* _args; // 线程参数
    std::string _name; // 线程名称
};

class Thread
{
public:
    // 构造函数接受三个参数：num 表示线程编号，callback 是一个函数指针，表示线程要执行的函数，args 是传递给线程函数的参数。
    Thread(int num, fun_t callback, void* args):_func(callback) // 回调指针
    {
        // 线程编号和函数指针存储在成员变量 _name 和 _func 中，并初始化 _tData 对象的成员变量 _args 和 _name。
        char nameBuffer[64]; // 存储线程名称
        snprintf(nameBuffer, sizeof(nameBuffer), "Thread-%d", num); // 将格式化字符串 "Thread-%d" 和 num 参数合并，生成线程的名称
        _name = nameBuffer; // 赋值名称

        _tData._args = args;
        _tData._name = _name;
    }

    ~Thread()
    {}

    void start() // 创建线程
    {
        pthread_create(&_tid, nullptr, _func, (void*)&_tData);
    }

    void join() // 等待线程完成
    {
        pthread_join(_tid, nullptr);
    }

    std::string name() // 返回线程名称
    {
        return _name;
    }

private:
    std::string _name; // 线程名称
    fun_t _func;   // 函数指针：存储线程要执行的函数
    ThreadData _tData;
    pthread_t _tid;
};